﻿using System;
using System.Text;
using System.Drawing;
using System.Buffers;
using System.Collections;
using System.Collections.Generic;
using System.Runtime.InteropServices;

public static partial class glDRIVE
{
    /*
    函数 gl.runge_kutta
    变步长Runge_Kutta方法
    f计算微分方程组中各方程右端函数值的函数名。
    参数 t: 积分起始点。
    参数 h: 积分步长。
    参数 n: 一阶微分方程组中方程个数，也是未知函数个数。
    参数 y: y[n]存放n个未知函数在起始点t处的函数值。返回n个未知函数在t+h处的函数值。
    参数 eps: 控制精度要求。
    */

    public static unsafe string drive_runge_kutta()
    {
        int j;
        double t, h, eps;
        double[] y = new double[2];

        y[0] = 0.0;
        y[1] = 1.0;
        t = 0.0;
        h = 0.1;
        eps = 0.0000001;
        gl.f_x_ya_n_da = rktf;

        string rs = "";
        rs += gl.html_table("变步长Runge_Kutta方法，函数（t=" + t + "）处的函数值", y);
        for (j = 1; j <= 10; j++)
        {
            gl.runge_kutta(t, h, 2, y, eps);
            rs += gl.html_table("函数（t=" + t + "）处的函数值", y);
            t = t + h;
        }
        return rs;
    }

    // 计算微分方程组中各方程右端函数值
    private static unsafe void rktf(double t, double* y, int n, double* d)
    {
        //t=t; n=n;
        d[0] = y[1]; 
        d[1] = -y[0];
        return;
    }
}